package LeetCode.interview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import LeetCode.interview._104_Maximum_Depth_of_Binary_Tree.TreeNode;
import sun.tools.jar.resources.jar;
import util.LogUtils;
import util.datastructure.ListNode;

/*
 * 
原题　
	
	Given a linked list and a value x, partition it such that all nodes less than x come before nodes greater than or equal to x.
	
	You should preserve the original relative order of the nodes in each of the two partitions.
	
	For example,
	Given 1->4->3->2->5->2 and x = 3,
	return 1->2->2->4->3->5. 
题目大意

	给定一个链表和一个值x，对它进行分区，使得小于x的所有节点都在大于或等于x的节点之前。
	
	您应该保留两个分区中的每一个节点的原始相对顺序。
	
	例如，
	给定1-> 4-> 3-> 2-> 5-> 2和x = 3，
	返回1-> 2-> 2-> 4-> 3-> 5。
解题思路
		这道题就是说给定一个x的值，小于x都放在大于等于x的前面，并且不改变链表之间node原始的相对位置。
		每次看这道题我老是绕晕，纠结为什么4在3的前面。。其实还是得理解题意，4->3->5都是大于等3的数，而且这保持了他们原来的相对位置 。
	
	所以，这道题是不需要任何排序操作的，题解方法很巧妙。
	
	new两个新链表，一个用来创建所有大于等于x的链表，一个用来创建所有小于x的链表。
	
	遍历整个链表时，当当前node的val小于x时，接在小链表上，反之，接在大链表上。这样就保证了相对顺序没有改变，而仅仅对链表做了与x的比较判断。
	
	最后，把小链表接在大链表上，别忘了把大链表的结尾赋成null。
 * @Date 2017-10-09 00：06
 */
public class _086_Partition_List {
    public ListNode partition(ListNode head, int x) {
    	if (head==null || head.next==null)	return head;
    	ListNode smallHead = new ListNode(-1);	//临时头
    	ListNode bigHead = new ListNode(-1);	//临时头
    	ListNode small = smallHead, big = bigHead;
    	ListNode p = head;
    	while (p != null) {
    		if (p.val < x) {
    			small.next = p;
    			small = small.next;
    		} else {
    			big.next = p;
    			big = big.next;
    		}
			p = p.next;
    	}
    	big.next = null;
    	//将大链表接在小链表之后
 
      	small.next = bigHead.next;
    	ListNode.traverse("rs", smallHead.next);
        return smallHead.next;
    }
    
	public static void main(String[] args) {
		_086_Partition_List obj = new _086_Partition_List();

		obj.partition(ListNode.newLinkListIn_086(), 0);
	}

}
